home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Collection of Tools & Utilities
/
Collection of Tools and Utilities.iso
/
c
/
cug190.zip
/
AS68.C
next >
Wrap
Text File
|
1985-11-15
|
24KB
|
891 lines
/******************************************************************
as68.c, the source of a 68000 assembler....
*/
/* (C) Copyright 1982 Steve Passe */
/* All Rights Reserved */
/* ver. 1.00 */
/* created 10/7/82 */
/* version 1.01
8/30/83 ver. 1.01 modified for Aztec ver. 1.05g smp
12/23/83 fixed 24 bit address bug in flush_rcrd smp
12/24/83 fixed lowercase a-f in S-records smp
*/
/* begincode */
/* includes */
#define AZTECZII 1
#ifndef AZTECZII
#include <stdio.h>
#else
#include "stdio.h" /* with aztecII compiler */
#endif
#include "b:as68.h"
/* externals */
struct _symbol *symtbl;
struct _symbol *syms_head; /* head of sym table free space */
char *syms_tail; /* tail of sym table free space */
int symspace = SYMTSIZE; /* bytes in symbol table */
int symbols = 0; /* number of symbols in table */
FLAG fatal = NO;
char pass = 1; /* present pass number, 1 or 2 */
unsigned line_count = 0; /* line number of source file */
unsigned list_count = 0; /* line # of list file */
long loc_counter = 0; /* address to assemble obj code */
int loc_plus = 0; /* increment to loc counter */
char lcksm; /* bytes + addr. + count + lcksm == 0xff */
FLAG abs_long = YES; /* default to absolute long add.*/
FLAG rorg = NO; /* prog. counter relative flag */
FLAG do_label = YES; /* process label if set */
char statement[STMNT_SIZE]; /* statement line buffer */
char label[32]; /* bufr for label from preparse */
char instr[32]; /* bufr for mnem, psdo or macro */
char *opfld_ptr; /* pointer to operand field */
char *stmnt_ptr; /* ptr to statement field */
char stmnt_typ; /* statement type, instr, pseudo */
int wrap = 80; /* wrap column for list output */
FLAG trunc = NO; /* truncate lines in listing */
char source_name[FNAME_SIZE]; /* source file name */
int src_level = 0; /* source file level */
FILE *_src[SRCLEVELS]; /* source file descripters */
FLAG objchnl = 's'; /* Motorola S ('s') or nil ('x') */
FLAG obj_open = NO; /* object channel open flag */
char of_disk = NULL; /* default object file drive */
char object_name[FNAME_SIZE]; /* object file name */
FILE *obj_f; /* object file descripter */
FLAG lstchnl = NO; /* list channel(s) open */
FLAG nolist = NO; /* flag for list/nolist pseudos */
FLAG lcon = NO; /* list to console flag */
FLAG llst = NO; /* list to list device flag */
FLAG lfile = NO; /* list to file flag */
FLAG lfile_open = NO; /* list file open flag */
char lf_disk = NULL; /* default list file drive */
char list_name[FNAME_SIZE]; /* listing file name */
FILE *lst_f, *lst_d; /* listing file & dev descripter */
FLAG errchnl = YES; /* error channel(s) open */
FLAG econ = YES; /* errors to console flag */
FLAG elst = NO; /* errors to list device flag */
FLAG elfile = NO; /* errors to listing file */
FLAG efile = NO; /* errors to error file */
FLAG efile_open = NO; /* error file open flag */
char ef_disk = NULL; /* default error file drive */
char error_name[FNAME_SIZE]; /* error file name */
FILE *err_f; /* error file descripter */
struct _oprnd op1, op2; /* structs to hold operand val */
char code[12]; /* 12 minimum for overflow */
char buf[85];
long lex_val;
char *p;
extern struct _mtable mtable[];
/* beginmain */
main(argc, argv)
int argc;
char *argv[];
{
register int x, y;
char *c_ptr; /* scratch pointer to char */
char _ext[5]; /* scratch ext buffer */
struct _ptable *pt; /* function ptr returned by psdosearch */
struct _mtable *mt; /* function ptr returned by mnemsearch */
long _dtol();
puts("\nas68, ver 1.01, 68000 assembler, (C) Copyright 1982 Steve Passe\n");
/** parse the command line, setting variables as needed */
if (argc < 2) {
puts("\n...source file?");
exit(0);
}
/** set flag variables according to command line args */
for (x = 2; x < argc; ++x) {
switch (tolower(argv[x][0])) {
case 'e': /* error file opt */
econ = NO;
for (y = 1; argv[x][y]; ++y) {
switch (tolower(argv[x][y])) {
case 'c': econ = YES; continue;
case 'l': elst = YES; continue;
case 'f': elfile = YES; continue;
case 'e': efile = YES;
if (argv[x][y+1] && argv[x][y+2] == ':') {
ef_disk = argv[x][++y];
++y;
}
continue;
default: errchnl = NO;
}
}
continue;
case 'l': /* list file opt */
lstchnl = YES;
for (y = 1; argv[x][y]; ++y) {
switch (tolower(argv[x][y])) {
case 'c': lcon = YES; continue;
case 'l': llst = YES; continue;
case 'f': lfile = YES;
if (argv[x][y+1] && argv[x][y+2] == ':') {
lf_disk = argv[x][++y];
++y;
}
continue;
default: lstchnl = NO;
}
}
continue;
case 'o': /* object file opt */
for (y = 1; argv[x][y]; ++y) {
switch (tolower(argv[x][y])) {
case 's': objchnl = 's';
if (argv[x][y+1] && argv[x][y+2] == ':') {
of_disk = argv[x][++y];
++y;
}
continue;
default: objchnl = 'x';
}
}
continue;
case 's':
opfld_ptr = &argv[x][1];
symspace = (int) _dtol();
continue;
case 'w':
wrap = atoi(&argv[x][1]);
if (wrap < 60) wrap = 60;
continue;
case 't':
trunc = YES;
continue;
default: puts("\nhuh?"); exit(0);
}
}
if (!(symtbl = alloc(symspace))) { /* allocate space for symbol table */
printf("\n...symbol table too large (%d)", symspace);
exit(0);
}
syms_head = symtbl + 1; /* init free space head */
syms_tail = symtbl; syms_tail += symspace; /* init free space tail */
symtbl[0]._sym = ""; /* dummy entry */
symtbl[0]._val = NULL;
symtbl[0]._atr = NULL;
/* initialize sourcename, errname, listname, and objname */
if (too_long(argv[1], 14)) {
exit(0);
}
if (argv[1][1] == ':') { /* a disk identifier exists */
strcpy(source_name, argv[1]); /* get source file name */
}
else { /* default to logged in disk */
if (too_long(argv[1], 12)) {
exit(0);
}
source_name[0] = bdos(CURR_DISK, 0) + 'A'; /* read default disk */
source_name[1] = ':'; /* separator */
source_name[2] = '\0'; /* make a string */
strcat(source_name, argv[1]); /* add the name */
}
if (c_ptr = cisat('.', source_name)) { /* if extension */
word_copy(_ext, 4, c_ptr); /* save ext */
*c_ptr = '\0'; /* erase it */
}
else strcpy(_ext, ".sa"); /* default extension */
if (too_long(source_name, 10)) {
exit(0);
}
strcpy(object_name, source_name); /* make object file name */
switch (objchnl) {
case 'x': break; /* none wanted */
case 's': strcat(object_name, ".mx"); /* for Motorola S FILE */
break;
default: printf("\n...bad object file type ('%c')", objchnl);
}
if (of_disk) object_name[0] = of_disk; /* pick up option */
strcpy(list_name, source_name);
strcat(list_name, ".ls"); /* make list file name */
if (lf_disk) list_name[0] = lf_disk; /* option */
strcpy(error_name, source_name);
strcat(error_name, ".err"); /* make error file name */
if (ef_disk) error_name[0] = ef_disk; /* option */
strcat(source_name, _ext); /* add ext. */
/* open appropriate source, list, error, and object files */
if (!(_src[0] = fopen(source_name, "r"))) {
printf("\n...can't open source (\"%s\")", source_name);
exit(0);
}
/* open list, err, and obj as needed */
if (objchnl != 'x') {
if (!(obj_f = fopen(object_name, "w"))) {
printf("\n...can't open object (\"%s\")", object_name);
exit(0);
}
obj_open = TRUE;
obj_out(OPEN, 0, 0);
}
if (lfile) {
if (!(lst_f = fopen(list_name, "w"))) {
printf("\n...can't open list (\"%s\")", list_name);
exit(0);
}
lfile_open = TRUE;
}
if (efile) {
if (!(err_f = fopen(error_name, "w"))) {
prin